package com.xbai.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;

/**
 * @author jxbai
 * @desc 切面类
 * @Aspect：告诉Spring当前类是一个切面类
 * @date 2021/4/28 0028
 */
@Aspect
public class LogAspects {

    // 抽取公共的切入点表达式，本类使用直接使用方法名，其他的页面使用，使用方法的完整路径
    @Pointcut("execution(public int com.xbai.aop.MathCalculator.*(..))")
    public void pointCut() {}

    // @Before 在目标方法之前切入；切入点表达式（指定在哪个方法缺如）
    @Before("pointCut()")
    public void logStart(JoinPoint joinPoint) {
        System.out.println(joinPoint.getSignature().getName() + "方法开始运行。。。参数列表：{" + joinPoint.getArgs() + "}" );
    }

    @After("pointCut()")
    public void logEnd(JoinPoint joinPoint) {
        System.out.println(joinPoint.getSignature().getName() + "方法运行结束。。。");
    }

    //JoinPoint 一定要出现在参数表第一位
    @AfterReturning(value = "pointCut()", returning = "result")
    public void logReturn(JoinPoint joinPoint, Object result) {
        System.out.println(joinPoint.getSignature().getName() + "方法正常返回。。。运行结果：{" + result + "}");
    }

    @AfterThrowing(value = "pointCut()", throwing = "exception")
    public void logException(JoinPoint joinPoint, Exception exception) {
        System.out.println(joinPoint.getSignature().getName() + "方法异常。。。异常信息：{ " + exception + " }");
    }
}
